package traingle;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 杨辉三角-List写法

public class TrainDemo {
    public List<List<Integer>> generate(int numRows) {

        // List<List<Integer>>：实际意义是一个二维数组，也就是两个一维数组，元素类型是int类型
        // 每行第一个元素以及最后一个元素都是1，其余元素是上面两个元素之和

        // 一定要注意二维数组要进行两次实例化new操作
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> ret = new ArrayList<>();

        ret.add(1);
        list.add(ret);// 第一行第一列搞定！

        // 从1一行开始是因为之前第一行已经搞定！
        for(int i=1; i<numRows; i++) {
            // 当前行-一维数组
            List<Integer> curRow = new ArrayList<>();
            curRow.add(1); // 当前每行第一列为1 ok！

            /// 上一行
            //List<Integer> preRow = new ArrayList<>(); // 错误，这样并未给其初始化！

            List<Integer> preRow = list.get(i-1); //注意！！

            // 从1开始是因为首列值已经确定，以及只有从1开始才能取到前一行的首列0列
            // 注意该处循环的次数！！
            //for(int j=1; j<numRows-1; j++) {

            // 需要使用上一行最后一列，因为计算需要，但是每行总会比上一行多一列，最后一列为1，需要后面单独拎出来add1
            for(int j=1; j<i; j++) {
                curRow.add(preRow.get(j-1)+preRow.get(j));  //取之前行的两列相加之和！
            }

            curRow.add(1); // 每行最后一列为1
            // 此时当前行就是完整一行了！
            list.add(curRow); // 再将当前行传入到二维数组
        }
        return list;


        // 以下是错误代码
       /* for(int i=0; i<numRows; i++) {
            list.get(i).add(1); // 如果要使用该种写法，就需要 list.add(new ArrayList<>());
            for(int j=1; j<numRows-1; j++) {
                int bef = list.get(i-1).get(j-1);
                int aft = list.get(i-1).get(j);
                list.get(i).add(j,(bef+aft));
            }
            list.get(i).add(numRows-1,1);
        }
        return list;*/
    }

    public static void main(String[] args) {
        TrainDemo trainDemo = new TrainDemo();
        int numRows = 0;
        System.out.println("请输入任意行数：");
        Scanner scanner = new Scanner(System.in);
        numRows = scanner.nextInt();

        try {
            if(numRows<=0) {
                throw new NumberNotlegalException("输入为非正，不合法！");
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }

        List<List<Integer>> list = trainDemo.generate(numRows);

        // 进行打印
        for (int i=0; i<numRows; i++) {
            System.out.println(list.get(i));
        }
    }
}
